package account.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MobilePhoneNumber {

    private final Object data;

    public String asPlainText() {
        if (data instanceof String plainText) {
            return plainText;
        }
        return "";
    }

    private MobilePhoneNumber(String plainText) {
        data = plainText;
    }

    public static MobilePhoneNumber fromUncheckedInput(CharSequence input) throws MobilePhoneNumberParser.TextParserError {
        if (null == input) {
            // FIXME: 暂时还不确定应该何时抛出空指针异常
            return new MobilePhoneNumber(null);
        }
        return TEXT_PARSER.parse(input);
    }

    private static final TextParser<MobilePhoneNumber> TEXT_PARSER;

    static {
        TEXT_PARSER = new MobilePhoneNumberParser();
    }

    private static class MobilePhoneNumberParser implements TextParser<MobilePhoneNumber> {
        @Override
        public MobilePhoneNumber parse(CharSequence textInput) throws TextParserError {
            if (null == textInput) {
                throw new TextParserError("Unexpected null pointer detected at "+ this.getClass().getSimpleName());
            }
            String filtered = filterOutNoneDigitCharacters(textInput);
            if (!patternOfNumberIsValid(filtered)) {
                throw new TextParserError("手机号码格式不满足要求: " + textInput);
            }
            return new MobilePhoneNumber(filtered);
        }

        private final static Pattern NoneDigitCharacterFilterPattern = Pattern.compile("[^\\d]");

        private static String filterOutNoneDigitCharacters(CharSequence phoneNumber) {
            final Matcher matcher = NoneDigitCharacterFilterPattern.matcher(phoneNumber);
            return matcher.replaceAll("");
        }

        // TODO: 未来必要时可以引进更精确的手机号码匹配规则
        private final static Pattern MobilePhoneNumberPattern = Pattern.compile("^1[3-9]\\d{9}$");

        private static boolean patternOfNumberIsValid(CharSequence phoneNumber) {
            final Matcher matcher = MobilePhoneNumberPattern.matcher(phoneNumber);
            return matcher.matches();
        }
    }
}

/*
各大运营商手机号码段

【中国联通号段】
130、131、132、145、155、156、166、167、171、175、176、185、186、196

【中国电信号段】
133、153、173、177、180、181、189、190、191、193、199

【中国移动号段】
134[0-8]、135、136、137、138、139、1440、147、148、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、198

【中国广电号段】
192

【其他号段】
14号段部分为上网卡专属号段：中国联通145，中国移动147，【中国电信149】

【虚拟运营商】
电信：1700、1701、1702、162
移动：1703、1705、1706、165
联通：1704、1707、1708、1709、171、167
卫星通信：1349、174
物联网：140、141、144、146、148
*/

/*
通过以上号段可以看出，手机号码起始1，第二位是3456789中的任意一个，第三位有的是0-9全段，有的只是部分，如下：

13和18开头的手机号是全段

13开头的手机号是全段：13 [0123456789] 比如130，131，132…139
18开头的手机号是全段：18[0123456789] 比如180，181，182…189


15和19开头的手机号后面除4外都有，无154和194

15 [012356789] 比如150，151，152，153，155…159
19 [012356789] 比如190，191，192，193，195…159


17开头的手机号后面除9外都有

17 [01235678] 比如170，171，172，173…178


14开头的手机号除2,3外都有，无142和143

14[01456879] 比如140,141,144，145…149


16开头的手机号后面只有2567

16[2567] 比如：162,165,166,167

————————————————
版权声明：本文为CSDN博主「itbrand」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/itbrand/article/details/109239620
*/